//
//  BaseXmlParser.h
//  BosidengIphone
//
//  Created by  on 11-12-26.
//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <libxml/tree.h>

@interface BaseXmlParser : NSObject {
    
    NSMutableDictionary *    _root ;
    
}

// Property

- ( void )startElementLocalName:( const xmlChar *)localname

                         prefix:( const xmlChar *)prefix

                            URI:( const xmlChar *)URI

                  nb_namespaces:( int )nb_namespaces

                     namespaces:( const xmlChar **)namespaces

                  nb_attributes:( int )nb_attributes

                   nb_defaulted:( int )nb_defaultedslo

                     attributes:( const xmlChar **)attributes;

- ( void )endElementLocalName:( const xmlChar *)localname

                       prefix:( const xmlChar *)prefix URI:( const xmlChar *)URI;

- ( void )charactersFound:( const xmlChar *)ch

                      len:( int )len;

-( NSDictionary *)getAtributes:( const xmlChar **)attributes withSize:( int )nb_attributes;

-( NSDictionary *)getResult;

@end

//3 个静态方法的实现，其实是调用了 ctx 的成员方法，其中 ctx 在 _parserContext 初始化时传入

static void startElementHandler(
                                
                                void * ctx,
                                
                                const xmlChar * localname,
                                
                                const xmlChar * prefix,
                                
                                const xmlChar * URI,
                                
                                int nb_namespaces,
                                
                                const xmlChar ** namespaces,
                                
                                int nb_attributes,
                                
                                int nb_defaulted,
                                
                                const xmlChar ** attributes)

{
    
    [( BaseXmlParser *)ctx
     
     startElementLocalName :localname
     
     prefix :prefix URI :URI
     
     nb_namespaces :nb_namespaces
     
     namespaces :namespaces
     
     nb_attributes :nb_attributes
     
     nb_defaulted :nb_defaulted
     
     attributes :attributes];
    
}



static void endElementHandler(
                              
                              void * ctx,
                              
                              const xmlChar * localname,
                              
                              const xmlChar * prefix,
                              
                              const xmlChar * URI)

{
    
    [( BaseXmlParser *)ctx
     
     endElementLocalName :localname
     
     prefix :prefix
     
     URI :URI];
    
}



static void charactersFoundHandler(
                                   
                                   void * ctx,
                                   
                                   const xmlChar * ch,
                                   
                                   int len)

{
    
    [( BaseXmlParser *)ctx
     
     charactersFound :ch len :len];
    
}

//libxml 的 xmlSAXHandler 结构体定义，凡是要实现的 handler 函数都写在这里，不准备实现的用 null 代替。一般而言，我们只实现其中 3 个就够了

static xmlSAXHandler _saxHandlerStruct = {
    
    NULL ,              /* internalSubset */
    
    NULL ,            /* isStandalone   */
    
    NULL ,            /* hasInternalSubset */
    
    NULL ,            /* hasExternalSubset */
    
    NULL ,            /* resolveEntity */
    
    NULL ,            /* getEntity */
    
    NULL ,            /* entityDecl */
    
    NULL ,            /* notationDecl */
    
    NULL ,            /* attributeDecl */
    
    NULL ,            /* elementDecl */
    
    NULL ,            /* unparsedEntityDecl */
    
    NULL ,            /* setDocumentLocator */
    
    NULL ,            /* startDocument */
    
    NULL ,            /* endDocument */
    
    NULL ,            /* startElement*/
    
    NULL ,            /* endElement */
    
    NULL ,            /* reference */
    
    charactersFoundHandler, /* characters */
    
    NULL ,              /* ignorableWhitespace */
    
    NULL ,            /* processingInstruction */
    
    NULL ,            /* comment */
    
    NULL ,             /* warning */
    
    NULL ,            /* error */
    
    NULL ,              /* fatalError //: unused error() get all the errors */
    
    NULL ,              /* getParameterEntity */
    
    NULL ,            /* cdataBlock */
    
    NULL ,            /* externalSubset */
    
    XML_SAX2_MAGIC ,  /* initialized 特殊常量，照写 */
    
    NULL ,            /* private */
    
    startElementHandler,    /* startElementNs */
    
    endElementHandler,      /* endElementNs */
    
    NULL ,              /* serror */
    
};
